jetcrab\bytecode\scope/
local_vars.rs

1use crate::vm::types::LocalIndex;
2use std::collections::HashMap;
3
4pub trait ScopeManager {
5    fn get_or_create_local(&mut self, name: &str) -> LocalIndex;
6    fn get_local(&self, name: &str) -> Option<&LocalIndex>;
7    fn is_array_variable(&self, name: &str) -> bool;
8}
9
10pub trait ScopeCore {
11    fn local_vars(&self) -> &HashMap<String, LocalIndex>;
12    fn local_vars_mut(&mut self) -> &mut HashMap<String, LocalIndex>;
13    fn next_local(&self) -> usize;
14    fn set_next_local(&mut self, next: usize);
15}
16
17impl<T> ScopeManager for T
18where
19    T: ScopeCore,
20{
21    fn get_or_create_local(&mut self, name: &str) -> LocalIndex {
22        if let Some(&idx) = self.local_vars().get(name) {
23            idx
24        } else {
25            let idx = LocalIndex::new(self.next_local());
26            self.local_vars_mut().insert(name.to_string(), idx);
27            self.set_next_local(self.next_local() + 1);
28            idx
29        }
30    }
31
32    fn get_local(&self, name: &str) -> Option<&LocalIndex> {
33        self.local_vars().get(name)
34    }
35
36    fn is_array_variable(&self, name: &str) -> bool {
37        // Simple heuristic: check if variable name suggests it's an array
38        let name_lower = name.to_lowercase();
39        name_lower.contains("array")
40            || name_lower.contains("list")
41            || name_lower.contains("items")
42            || name_lower.contains("fruits")
43            || name_lower.contains("numbers")
44            || name_lower.contains("colors")
45            || name_lower.contains("names")
46            || name_lower.contains("data")
47            || name_lower.contains("elements")
48            || name_lower.contains("values")
49            || name_lower.contains("collection")
50            || name_lower.contains("set")
51            || name_lower.contains("group")
52            || name_lower.contains("bunch")
53            || name_lower.contains("lot")
54            || name_lower.contains("series")
55            || name_lower.contains("sequence")
56            || name_lower.contains("row")
57            || name_lower.contains("column")
58            || name_lower.contains("stack")
59            || name_lower.contains("queue")
60            || name_lower.contains("heap")
61            || name_lower.contains("tree")
62            || name_lower.contains("graph")
63            || name_lower.contains("matrix")
64            || name_lower.contains("table")
65            || name_lower.contains("grid")
66            || name_lower.contains("board")
67            || name_lower.contains("deck")
68            || name_lower.contains("pack")
69            || name_lower.contains("bundle")
70            || name_lower.contains("batch")
71            || name_lower.contains("cluster")
72            || name_lower.contains("arr")
73    }
74}